home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / vbcc.lha / vbcc / parse_expr.c < prev    next >
C/C++ Source or Header  |  1997-12-30  |  19KB  |  771 lines

  1. /*  $VER: vbcc (parse_expr.c) V0.5  */
  2.  
  3. #include "vbc.h"
  4.  
  5. static char FILE_[]=__FILE__;
  6.  
  7. np expression(void)
  8. /*  Komma-Ausdruecke  */
  9. {
  10.   np left,right,new;
  11.   left=assignment_expression();
  12.   if(!left->flags) return 0;
  13.   killsp();
  14.   while(*s==','){
  15.     s++;
  16.     killsp();
  17.     right=assignment_expression();
  18.     new=mymalloc(NODES);
  19.     new->left=left;
  20.     new->right=right;
  21.     new->ntyp=0;
  22.     new->flags=KOMMA;
  23.     left=new;
  24.     killsp();
  25.   }
  26.   return left;
  27. }
  28. np assignment_expression(void)
  29. /*  Zuweisungsausdruecke  */
  30. {
  31.   np left,new;int c=0;
  32.   left=conditional_expression();
  33.   killsp();
  34.   if(*s!='='&&s[1]!='='&&s[2]!='=') return left;
  35.   if(*s=='=') {c=ASSIGN;s++;}
  36.   else if(*s=='*'&&s[1]=='=') {c=ASSIGNMULT;s+=2;}  
  37.   else if(*s=='/'&&s[1]=='=') {c=ASSIGNDIV;s+=2;}   
  38.   else if(*s=='%'&&s[1]=='=') {c=ASSIGNMOD;s+=2;}   
  39.   else if(*s=='+'&&s[1]=='=') {c=ASSIGNADD;s+=2;}   
  40.   else if(*s=='-'&&s[1]=='=') {c=ASSIGNSUB;s+=2;}   
  41.   else if(*s=='&'&&s[1]=='=') {c=ASSIGNAND;s+=2;}   
  42.   else if(*s=='^'&&s[1]=='=') {c=ASSIGNXOR;s+=2;}   
  43.   else if(*s=='|'&&s[1]=='=') {c=ASSIGNOR;s+=2;}    
  44.   else if(*s=='<'&&s[1]=='<') {c=ASSIGNLSHIFT;s+=3;}
  45.   else if(*s=='>'&&s[1]=='>') {c=ASSIGNRSHIFT;s+=3;}
  46.   else return left;
  47.   new=mymalloc(NODES);
  48.   new->left=left;
  49.   new->ntyp=0;
  50.   if(c==ASSIGN){
  51.     new->right=assignment_expression();
  52.     new->flags=ASSIGN;
  53.   }else{
  54.     /*  ASSIGNOP(a,b)->ASSIGN(a,OP(a,b))    */
  55.     new->flags=ASSIGNADD;   /* nur um zum Merken, dass nur einmal */
  56.                             /* ausgewertet werden darf            */
  57.     new->right=mymalloc(NODES);
  58.     new->right->left=left;
  59.     new->right->right=assignment_expression();
  60.     new->right->ntyp=0;
  61.     if(c==ASSIGNMULT) new->right->flags=MULT;
  62.     else if(c==ASSIGNDIV) new->right->flags=DIV;
  63.     else if(c==ASSIGNMOD) new->right->flags=MOD;
  64.     else if(c==ASSIGNADD) new->right->flags=ADD;
  65.     else if(c==ASSIGNSUB) new->right->flags=SUB;
  66.     else if(c==ASSIGNAND) new->right->flags=AND;
  67.     else if(c==ASSIGNXOR) new->right->flags=XOR;
  68.     else if(c==ASSIGNOR) new->right->flags=OR;
  69.     else if(c==ASSIGNLSHIFT) new->right->flags=LSHIFT;
  70.     else if(c==ASSIGNRSHIFT) new->right->flags=RSHIFT;
  71.   }
  72.   return new;
  73. }
  74. np conditional_expression(void)
  75. /*  Erledigt ? :   */
  76. {
  77.   np left,new;
  78.   left=logical_or_expression();
  79.   killsp();
  80.   if(*s=='?'){   
  81.     s++;killsp();
  82.     new=mymalloc(NODES);
  83.     new->flags=COND;
  84.     new->ntyp=0;
  85.     new->left=left;
  86.     new->right=mymalloc(NODES);
  87.     new->right->flags=COLON;
  88.     new->right->ntyp=0;
  89.     new->right->left=expression();
  90.     killsp();
  91.     if(*s==':'){s++;killsp();} else error(70);
  92.     new->right->right=conditional_expression();
  93.     left=new;
  94.     killsp();
  95.   }
  96.   return left;
  97. }
  98. np logical_or_expression(void)
  99. /*  Erledigt ||  */
  100. {
  101.   np left,right,new;
  102.   left=logical_and_expression();
  103.   killsp();
  104.   while(*s=='|'&&s[1]=='|'){
  105.     s+=2;
  106.     killsp();
  107.     right=logical_and_expression();
  108.     new=mymalloc(NODES);
  109.     new->left=left;
  110.     new->right=right;
  111.     new->flags=LOR;
  112.     new->ntyp=0;
  113.     left=new;
  114.     killsp();
  115.     if(*s=='&'&&s[1]=='&') error(222);
  116.   }
  117.   return left;
  118. }
  119. np logical_and_expression(void)
  120. /*  Erledigt &&  */
  121. {
  122.   np left,right,new;
  123.   left=inclusive_or_expression();
  124.   killsp();
  125.   while(*s=='&'&&s[1]=='&'){
  126.     s+=2;
  127.     killsp();
  128.     right=inclusive_or_expression();
  129.     new=mymalloc(NODES);
  130.     new->left=left;
  131.     new->right=right;
  132.     new->flags=LAND;
  133.     new->ntyp=0;
  134.     left=new;
  135.     killsp();
  136.     if(*s=='|'&&s[1]=='|') error(222);
  137.   }
  138.   return left;
  139. }
  140. np inclusive_or_expression(void)
  141. /*  Erledigt |  */
  142. {
  143.   np left,right,new;
  144.   left=exclusive_or_expression();
  145.   killsp();
  146.   while(*s=='|'&&s[1]!='|'&&s[1]!='='){
  147.     s++;
  148.     killsp();
  149.     right=exclusive_or_expression();
  150.     new=mymalloc(NODES);
  151.     new->left=left;
  152.     new->right=right;
  153.     new->flags=OR;
  154.     new->ntyp=0;
  155.     left=new;
  156.     killsp();
  157.   }
  158.   return left;
  159. }
  160. np exclusive_or_expression(void)
  161. /*  Erledigt ^  */
  162. {
  163.   np left,right,new;
  164.   left=and_expression();
  165.   killsp();
  166.   while(*s=='^'&&s[1]!='='){
  167.     s++;
  168.     killsp();
  169.     right=and_expression();
  170.     new=mymalloc(NODES);
  171.     new->left=left;
  172.     new->right=right;
  173.     new->flags=XOR;
  174.     new->ntyp=0;
  175.     left=new;
  176.     killsp();
  177.   }
  178.   return left;
  179. }
  180. np and_expression(void)
  181. /*  Erledigt &  */
  182. {
  183.   np left,right,new;
  184.   left=equality_expression();
  185.   killsp();
  186.   while(*s=='&'&&s[1]!='&'&&s[1]!='='){
  187.     s++;
  188.     killsp();
  189.     right=equality_expression();
  190.     new=mymalloc(NODES);
  191.     new->left=left;
  192.     new->right=right;
  193.     new->flags=AND;
  194.     new->ntyp=0;
  195.     left=new;
  196.     killsp();
  197.   }
  198.   return left;
  199. }
  200. np equality_expression(void)
  201. /*  Erledigt == und !=  */
  202. {
  203.   np left,right,new;int c;
  204.   left=relational_expression();
  205.   killsp();
  206.   while((*s=='='||*s=='!')&&s[1]=='='){
  207.     if(*s=='!') c=INEQUAL; else c=EQUAL;
  208.     s+=2;
  209.     killsp();
  210.     right=relational_expression();
  211.     new=mymalloc(NODES);
  212.     new->left=left;
  213.     new->right=right;
  214.     new->flags=c;
  215.     new->ntyp=0;
  216.     left=new;
  217.     killsp();
  218.   }
  219.   return left;
  220. }
  221. np relational_expression(void)
  222. /*  Erledigt <,>,<=,>=  */
  223. {
  224.   np left,right,new;int c;
  225.   left=shift_expression();
  226.   killsp();
  227.   while((*s=='<'&&s[1]!='<')||(*s=='>'&&s[1]!='>')){
  228.     if(*s++=='<'){
  229.       if(*s=='='){s++;c=LESSEQ;}else c=LESS;
  230.     }else{
  231.       if(*s=='='){s++;c=GREATEREQ;}else c=GREATER;
  232.     }
  233.     killsp();
  234.     right=shift_expression();
  235.     new=mymalloc(NODES);
  236.     new->left=left;
  237.     new->right=right;
  238.     new->flags=c;
  239.     new->ntyp=0;
  240.     left=new;
  241.     killsp();
  242.   }
  243.   return left;
  244. }
  245. np shift_expression(void)
  246. /*  Erledigt <<,>>  */
  247. {
  248.   np left,right,new;int c;
  249.   left=additive_expression();
  250.   killsp();
  251.   while((*s=='<'&&s[1]=='<'&&s[2]!='=')||(*s=='>'&&s[1]=='>'&&s[2]!='=')){
  252.     if(*s=='<') c=LSHIFT; else c=RSHIFT;
  253.     s+=2;
  254.     killsp();
  255.     right=additive_expression();
  256.     new=mymalloc(NODES);
  257.     new->left=left;
  258.     new->right=right;
  259.     new->flags=c;
  260.     new->ntyp=0;
  261.     left=new;
  262.     killsp();
  263.   }
  264.   return left;
  265. }
  266. np additive_expression(void)
  267. /*  Erledigt +,-  */
  268. {
  269.   np left,right,new;int c;
  270.   left=multiplicative_expression();
  271.   killsp();
  272.   while((*s=='+'||*s=='-')&&s[1]!='='){
  273.     if(*s++=='+') c=ADD; else c=SUB;
  274.     killsp();
  275.     right=multiplicative_expression();
  276.     new=mymalloc(NODES);
  277.     new->left=left;
  278.     new->right=right;
  279.     new->flags=c;
  280.     new->ntyp=0;
  281.     left=new;
  282.     killsp();
  283.   }
  284.   return left;
  285. }
  286. np multiplicative_expression(void)
  287. /*  Erledigt *,/,%  */
  288. {
  289.   np left,right,new;int c;
  290.   left=cast_expression();
  291.   killsp();
  292.   while((*s=='*'||*s=='/'||*s=='%')&&s[1]!='='){
  293.     if(*s=='*') c=MULT; else {if(*s=='/') c=DIV; else c=MOD;}
  294.     s++;
  295.     killsp();
  296.     right=cast_expression();
  297.     new=mymalloc(NODES);
  298.     new->left=left;
  299.     new->right=right;
  300.     new->flags=c;
  301.     new->ntyp=0;
  302.     left=new;
  303.     killsp();
  304.   }
  305.   return left;
  306. }
  307. np cast_expression(void)
  308. /*  Erledigt (typ)  */
  309. {
  310.   np new;char *imerk,buff[MAXI];
  311.   killsp();
  312.   if(*s!='('||!declaration(1)) return unary_expression();
  313.   s++;killsp();
  314.   new=mymalloc(NODES);
  315.   new->flags=CAST;
  316.   new->right=0;
  317.   imerk=ident;ident=buff;
  318.   new->ntyp=declarator(declaration_specifiers());
  319.   ident=imerk;
  320.   killsp();
  321.   if(*s!=')') error(59); else s++;
  322.   new->left=cast_expression();
  323.   return new;
  324. }
  325. np unary_expression(void)
  326. /*  Erledigt !,~,++,--,+,-,*,&,sizeof,__typeof  */
  327. {
  328.   np new;char *merk=s,buff[MAXI];
  329.   killsp();
  330.   if((*s!='s'&&*s!='_'&&*s!='+'&&*s!='-'&&*s!='&'&&*s!='*'&&*s!='~'&&*s!='!')||s[1]=='=') return postfix_expression();
  331.   if(*s=='s'||*s=='_'){
  332.     int fszof;
  333.     merk=s;cpbez(buff,0);s=merk;
  334.     if(strcmp("sizeof",buff)&&strcmp("__typeof",buff)){
  335.       return postfix_expression();
  336.     }else{
  337.       if(*buff=='s') fszof=1; else fszof=0;
  338.       s+=strlen(buff);
  339.       killsp();
  340.       new=mymalloc(NODES);
  341.       new->flags=CEXPR;
  342.       new->ntyp=mymalloc(TYPS);
  343.       if(fszof) new->ntyp->flags=UNSIGNED|LONG;
  344.         else   new->ntyp->flags=INT;
  345.       new->ntyp->next=0;
  346.       new->right=0;
  347.       new->left=0;
  348.       if(*s=='('&&declaration(1)){
  349.     struct Typ *t;
  350.     s++;killsp();
  351.     merk=ident;ident=buff;
  352.     t=declarator(declaration_specifiers());
  353.     if(type_uncomplete(t)) error(176);
  354.     ident=merk;
  355.     if(fszof)
  356.       new->val.vulong=zl2zul(szof(t));
  357.     else
  358.       new->v